Análisis de PM10, Temperatura Ambiente, Humedad Relativa y Ozono de estación Compartir#
Importación de Librerías
# Load libraries
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Load sklearn
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error
import warnings
warnings.filterwarnings("ignore")
A continuación usamos la función read_cvs() de la libreria pandaspara cargar los datos a nuestro entorno de trabajo.
df = pd.read_csv("data_2017_2022.csv", sep=";")
df_1 = df.copy()
df_1["medicion"]=df_1["medicion"].str.replace(",", ".").astype("float") # convertir variable medición a númerica
df_1['fecha'] = pd.to_datetime(df_1['fecha']) # convertir variable fecha a datatime
df_1 = df_1.pivot(index=["fecha", "estacion"],columns= "variable", values="medicion").reset_index()
df_1.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 473256 entries, 0 to 473255
Data columns (total 18 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 fecha 473256 non-null datetime64[ns, UTC]
1 estacion 473256 non-null object
2 black_carbon 8620 non-null float64
3 direccion_viento 204419 non-null float64
4 h2s 15353 non-null float64
5 humedad 230887 non-null float64
6 lluvia 260671 non-null float64
7 no2 1 non-null float64
8 o3 201936 non-null float64
9 pm10 234568 non-null float64
10 pm25 174546 non-null float64
11 presion 209181 non-null float64
12 radiacion_solar 221284 non-null float64
13 so2 132180 non-null float64
14 temperatura 267206 non-null float64
15 temperatura_10_m 13746 non-null float64
16 uv-pm 8620 non-null float64
17 velocidad_viento 205405 non-null float64
dtypes: datetime64[ns, UTC](1), float64(16), object(1)
memory usage: 65.0+ MB
Para más practicidad se renombran las variables de nuestro conjunto de datos.
df_1 = df_1.rename(columns={
'variable': 'var',
'black_carbon': 'BC',
'direccion_viento': 'WD',
'humedad': 'HR',
'lluvia': 'RF',
'presion': 'P',
'radiacion_solar': 'RS',
'temperatura': 'AT',
'temperatura_10_m': 'AT_10_m',
'uv-pm': 'UV',
'velocidad_viento': 'WS',
'h2s': 'H2S',
'no2': 'NO2',
'o3': 'O3',
'so2': 'SO2',
'pm10': 'PM10',
'pm25': 'PM2.5'
})
Dado que la variable la variable \(\text{NO}_2\) tiene solo \(1\) medición entre \(473.256\) registros durante el periodo analizado, lo que representa casi un \(100\%\) de datos faltantes, hemos optado por excluirla del análisis.
df_t = df_1.copy()
df_t = df_t.drop(columns=["NO2"])
A continuación visualizamos los datos correspondientes a la estación Compartira tráves de la función head()
df_compartir = df_t[df_t['estacion'] == 'compartir']
df_compartir.head()
| variable | fecha | estacion | BC | WD | H2S | HR | RF | O3 | PM10 | PM2.5 | P | RS | SO2 | AT | AT_10_m | UV | WS |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 2017-01-01 00:59:59+00:00 | compartir | NaN | 208.6 | NaN | 75.9 | 0.0 | 8.456252 | 221.0 | 161.0 | 680.5 | 0.0 | NaN | 25.3 | NaN | NaN | 1.4 |
| 11 | 2017-01-01 01:59:59+00:00 | compartir | NaN | 65.2 | NaN | 77.3 | 0.0 | 8.240431 | 229.0 | 147.0 | 680.0 | 0.0 | NaN | 25.0 | NaN | NaN | 0.8 |
| 20 | 2017-01-01 02:59:59+00:00 | compartir | NaN | 86.8 | NaN | 77.6 | 0.0 | 6.651205 | 136.0 | 78.0 | 679.5 | 0.0 | NaN | 24.6 | NaN | NaN | 1.4 |
| 29 | 2017-01-01 03:59:59+00:00 | compartir | NaN | 216.0 | NaN | 79.2 | 0.0 | 5.984123 | 101.0 | 46.0 | 679.5 | 0.0 | NaN | 24.1 | NaN | NaN | 1.5 |
| 38 | 2017-01-01 04:59:59+00:00 | compartir | NaN | 271.8 | NaN | 79.9 | 0.0 | 6.513865 | 90.0 | 54.0 | 679.8 | 0.0 | NaN | 24.1 | NaN | NaN | 1.9 |
df_base_aerea = df_t[df_t['estacion'] == 'base_aerea']
df_canaveralejo = df_t[df_t['estacion'] == 'canaveralejo']
df_era_obrero = df_t[df_t['estacion'] == 'era_obrero']
df_ermita = df_t[df_t['estacion'] == 'ermita']
df_flora = df_t[df_t['estacion'] == 'flora']
df_pance = df_t[df_t['estacion'] == 'pance']
df_transitoria = df_t[df_t['estacion'] == 'transitoria']
df_univalle = df_t[df_t['estacion'] == 'univalle']
Material Particulado de 10\(\mu m\) (PM10) #
import plotly.graph_objects as go
import pandas as pd
df_compartir['fecha'] = pd.to_datetime(df_compartir['fecha'])
# Crear la figura usando plotly.graph_objects
fig = go.Figure()
# Añadir la traza de la línea
fig.add_trace(go.Scatter(
x=df_compartir['fecha'],
y=df_compartir['PM10'],
mode='lines', # Mostrar la línea
line=dict(color='#30143F', width=2), # Cambiar el color de la línea y el ancho
name='PM10 (µg/m³)',
opacity=0.7 # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))
# Ajustar el diseño del gráfico
fig.update_layout(
title='PM10 a lo Largo del Tiempo',
xaxis_title='Fecha',
yaxis_title='PM10 (µg/m³)',
xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'), # Rotar etiquetas del eje X y formato de fecha
yaxis=dict(tickformat='.1f'), # Formato de los ticks del eje Y (un decimal)
template='plotly_white', # Fondo blanco
title_x=0.5, # Centrar el título
title_font=dict(size=16) # Ajusta el tamaño de la fuente del título
)
fig.show()
import plotly.express as px
import plotly.graph_objects as go
# Gráfico de densidad interactivo usando Plotly Express
fig_density = px.histogram(df_compartir, x="PM10", marginal="box", nbins=50, title="Densidad de PM10 Estación Compartir",
labels={'PM10': 'PM10 (µg/m³)'}, color_discrete_sequence=['#30143F'])
fig_density.update_traces(
marker=dict(color='#30143F', opacity=0.7), # Ajustar la opacidad de las barras
selector=dict(type='histogram')
)
# Ajustar el diseño del gráfico de densidad
fig_density.update_layout(
xaxis_title="PM10 (µg/m³)",
yaxis_title="Frecuencia",
showlegend=False
)
fig_density.show()
import plotly.graph_objects as go
import pandas as pd
df_compartir['fecha'] = pd.to_datetime(df_compartir['fecha'])
# Crear la columna 'Año' basada en 'fecha'
df_compartir['Año'] = df_compartir['fecha'].dt.year
# Crear una lista única de años para el eje x después de crear la columna 'Año'
años = sorted(df_compartir['Año'].unique())
# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31',
'#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']
figbox = go.Figure()
# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
df_subset = df_compartir[df_compartir['Año'] == año]
figbox.add_trace(go.Box(
y=df_subset['PM10'],
name=str(año),
marker_color=colores_años[i % len(colores_años)] # Asignar un color específico a cada año
))
figbox.update_layout(
title="Distribución de PM10 por Año",
xaxis_title="Año",
yaxis_title="PM10 (µg/m³)",
title_x=0.5, # Centrar el título
xaxis=dict(
title="Año",
tickmode='array',
tickvals=años,
ticktext=[str(año) for año in años] # Etiquetas para cada año
)
)
# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}
# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}
# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']
# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)
# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)
figbox = go.Figure()
# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
df_subset = df_compartir[df_compartir['Mes'] == mes]
figbox.add_trace(go.Box(
y=df_subset['PM10'],
name=mes,
marker_color=color
))
# Actualizar el diseño del gráfico
figbox.update_layout(
title="Distribución de PM10 Mensual",
xaxis_title="Mes",
yaxis_title="PM10 (µg/m³)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_meses,
ticktext=orden_meses,
categoryorder='array', # Ordenar los meses en el orden especificado
categoryarray=orden_meses # Especificar el orden de los meses
)
)
# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]
# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}
# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}
# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']
# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])
# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)
figbox = go.Figure()
# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
df_subset = df_compartir[df_compartir['Día'] == dia]
figbox.add_trace(go.Box(
y=df_subset['PM10'],
name=dia,
marker_color=color
))
# Actualizar el diseño del gráfico
figbox.update_layout(
title="Distribución PM10 por Día de la Semana",
xaxis_title="Día de la Semana",
yaxis_title="PM10 (µg/m³)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_dias,
ticktext=orden_dias,
categoryorder='array', # Ordenar los días en el orden especificado
categoryarray=orden_dias # Especificar el orden de los días de la semana
)
)
# Mostrar el gráfico interactivo
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]
# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}
# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f',
'#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433',
'#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c',
'#356d6f', '#1e616c', '#115f6a', '#006f6f']
# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")
# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)
figbox = go.Figure()
# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
df_subset = df_compartir[df_compartir['Hora'] == hora]
figbox.add_trace(go.Box(
y=df_subset['PM10'],
name=hora,
marker_color=color
))
# Actualizar el diseño del gráfico
figbox.update_layout(
title="Distribución de PM10 por Hora del Día",
xaxis_title="Hora del Día",
yaxis_title="PM10 (µg/m³)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_horas,
ticktext=orden_horas,
categoryorder='array', # Ordenar las horas en el orden especificado
categoryarray=orden_horas # Especificar el orden de las horas
)
)
figbox.show()
En relación con los gráficos analizados, se observa una tendencia consistente en la concentración de PM10 (µg/m³) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 4 y 9 a.m., la mediana de PM10 muestra un incremento comparado con otras horas, con una mayor dispersión en los datos entre las 6 y 7 a.m. Esto sugiere la posible presencia de eventos que elevan los niveles de PM10 durante la mañana. A partir de las 10 a.m., los valores de PM10 muestran una leve disminución, manteniéndose relativamente constantes hasta aproximadamente las 5 p.m. A partir de las 6 p.m. hasta las 9 p.m., se observa un ligero aumento en los niveles de PM10.
Temperatura Ambiente (AT) #
import plotly.graph_objects as go
import pandas as pd
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df_compartir['fecha'],
y=df_compartir['AT'],
mode='lines', # Mostrar la línea
line=dict(color='#30143F'), # Cambiar el color de la línea
name='Temperatura Ambiente (°C)',
opacity=0.7 # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))
fig.update_layout(
title='Temperatura Ambiente a lo Largo del Tiempo',
xaxis_title='Fecha',
yaxis_title='Temperatura Ambiente (°C)',
xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'), # Rotar etiquetas del eje X y formato de fecha
yaxis=dict(tickformat='.1f'), # Formato del eje Y (un decimal)
template='plotly_white', # Fondo blanco
title_x=0.5, # Centrar el título
title_font=dict(size=16) # Ajustar el tamaño de la fuente del título
)
# Mostrar el gráfico interactivo
fig.show()
import plotly.express as px
import plotly.graph_objects as go
fig_density = px.histogram(df_compartir, x="AT", marginal="box", nbins=50, title="Densidad de Temperatura Ambiente Estación Compartir",
labels={'Temperatura Ambiente (°C)'}, color_discrete_sequence=['#30143F'])
fig_density.update_traces(
marker=dict(color='#30143F', opacity=0.7), # Ajustar la opacidad de las barras
selector=dict(type='histogram')
)
fig_density.update_layout(
xaxis_title="'Temperatura Ambiente (°C)'",
yaxis_title="Frecuencia",
showlegend=False
)
fig_density.show()
import plotly.graph_objects as go
import pandas as pd
# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())
# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31',
'#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']
figbox = go.Figure()
# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
df_subset = df_compartir[df_compartir['Año'] == año]
figbox.add_trace(go.Box(
y=df_subset['AT'],
name=str(año),
marker_color=colores_años[i % len(colores_años)] # Asignar un color específico a cada año
))
figbox.update_layout(
title="Distribución de Temperatura Ambiente por Año",
xaxis_title="Año",
yaxis_title="Temperatura Ambiente (°C)",
title_x=0.5, # Centrar el título
xaxis=dict(
title="Año",
tickmode='array',
tickvals=años, # Asegurar que todos los años se muestran
ticktext=[str(año) for año in años] # Etiquetas para cada año
)
)
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}
# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}
# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']
# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)
# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)
figbox = go.Figure()
# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
df_subset = df_compartir[df_compartir['Mes'] == mes]
figbox.add_trace(go.Box(
y=df_subset['AT'],
name=mes,
marker_color=color
))
figbox.update_layout(
title="Distribución de Temperatura Ambiente Mensual",
xaxis_title="Mes",
yaxis_title="Temperatura Ambiente (°C)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_meses,
ticktext=orden_meses,
categoryorder='array', # Ordenar los meses en el orden especificado
categoryarray=orden_meses # Especificar el orden de los meses
)
)
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]
# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}
# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}
# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']
# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])
# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)
figbox = go.Figure()
# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
df_subset = df_compartir[df_compartir['Día'] == dia]
figbox.add_trace(go.Box(
y=df_subset['AT'],
name=dia,
marker_color=color
))
figbox.update_layout(
title="Distribución Temperatura Ambiente por Día de la Semana",
xaxis_title="Día de la Semana",
yaxis_title="Temperatura Ambiente (°C)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_dias,
ticktext=orden_dias,
categoryorder='array', # Ordenar los días en el orden especificado
categoryarray=orden_dias # Especificar el orden de los días de la semana
)
)
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]
# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}
# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f',
'#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433',
'#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c',
'#356d6f', '#1e616c', '#115f6a', '#006f6f']
# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")
# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)
# Crear una figura usando plotly.graph_objects
figbox = go.Figure()
# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
df_subset = df_compartir[df_compartir['Hora'] == hora]
figbox.add_trace(go.Box(
y=df_subset['AT'],
name=hora,
marker_color=color
))
figbox.update_layout(
title="Distribución de Temperatura Ambiente por Hora del Día",
xaxis_title="Hora del Día",
yaxis_title="Temperatura Ambiente (°C)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_horas,
ticktext=orden_horas,
categoryorder='array', # Ordenar las horas en el orden especificado
categoryarray=orden_horas # Especificar el orden de las horas
)
)
figbox.show()
En relación con los gráficos analizados, se observa una tendencia consistente en la temperatura ambiente (°C) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 7 a.m. y 2 p.m., la mediana de temperatura ambiente muestra un incremento comparado con otras horas, con una mayor dispersión en los datos entre las 8 a.m y 2 p.m. A partir de las 3 p.m., la temperatura ambiente muestran una leve disminución hasta las 9 p.m., posterior a ésta hora la temperatura se mantiene relativamente constantes hasta aproximadamente las 6 a.m. del siguiente día.
Humedad Relativa (HR) #
import plotly.graph_objects as go
import pandas as pd
fig = go.Figure()
# Añadir la traza de la línea
fig.add_trace(go.Scatter(
x=df_compartir['fecha'],
y=df_compartir['HR'],
mode='lines', # Mostrar la línea
line=dict(color='#30143F'), # Cambiar el color de la línea
name='Humedad Relativa (%)',
opacity=0.7 # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))
fig.update_layout(
title='Humedad Relativa a lo Largo del Tiempo',
xaxis_title='Fecha',
yaxis_title='Humedad Relativa (%)',
xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),
yaxis=dict(tickformat='.1f'), # Formato de los ticks del eje Y (un decimal)
template='plotly_white', # Fondo blanco
title_x=0.5, # Centrar el título
title_font=dict(size=16) # Ajustar el tamaño de la fuente del título
)
fig.show()
import plotly.express as px
import plotly.graph_objects as go
fig_density = px.histogram(df_compartir, x="HR", marginal="box", nbins=50, title="Densidad de Humedad Relativa Estación Compartir",
labels={'Temperatura Ambiente (°C)'}, color_discrete_sequence=['#30143F'])
fig_density.update_traces(
marker=dict(color='#30143F', opacity=0.7), # Ajustar la opacidad de las barras
selector=dict(type='histogram')
)
fig_density.update_layout(
xaxis_title="Humedad Relativa(%)",
yaxis_title="Frecuencia",
showlegend=False
)
fig_density.show()
import plotly.graph_objects as go
import pandas as pd
# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())
# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31',
'#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']
figbox = go.Figure()
# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
df_subset = df_compartir[df_compartir['Año'] == año]
figbox.add_trace(go.Box(
y=df_subset['HR'],
name=str(año),
marker_color=colores_años[i % len(colores_años)] # Asignar un color específico a cada año
))
figbox.update_layout(
title="Distribución de Humedad Relativa por Año",
xaxis_title="Año",
yaxis_title="Humedad Relativa (%)",
title_x=0.5, # Centrar el título
xaxis=dict(
title="Año",
tickmode='array',
tickvals=años, # Asegurar que todos los años se muestran
ticktext=[str(año) for año in años] # Etiquetas para cada año
)
)
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}
# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}
# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']
# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)
# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)
# Crear una figura usando plotly.graph_objects
figbox = go.Figure()
for mes, color in zip(orden_meses, colores_meses):
df_subset = df_compartir[df_compartir['Mes'] == mes]
figbox.add_trace(go.Box(
y=df_subset['HR'],
name=mes,
marker_color=color
))
figbox.update_layout(
title="Distribución de Humedad Relativa Mensual",
xaxis_title="Mes",
yaxis_title="Humedad Relativa (%)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_meses,
ticktext=orden_meses,
categoryorder='array', # Ordenar los meses en el orden especificado
categoryarray=orden_meses # Especificar el orden de los meses
)
)
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]
# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}
# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}
# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']
# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])
# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)
figbox = go.Figure()
# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
df_subset = df_compartir[df_compartir['Día'] == dia]
figbox.add_trace(go.Box(
y=df_subset['HR'],
name=dia,
marker_color=color
))
figbox.update_layout(
title="Distribución Humedad Relativa por Día de la Semana",
xaxis_title="Día de la Semana",
yaxis_title="Humedad Relativa (%)",
title_x=0.5,
xaxis=dict(
tickmode='array',
tickvals=orden_dias,
ticktext=orden_dias,
categoryorder='array', # Ordenar los días en el orden especificado
categoryarray=orden_dias # Especificar el orden de los días de la semana
)
)
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]
# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}
# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f',
'#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433',
'#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c',
'#356d6f', '#1e616c', '#115f6a', '#006f6f']
# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")
# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)
figbox = go.Figure()
# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
df_subset = df_compartir[df_compartir['Hora'] == hora]
figbox.add_trace(go.Box(
y=df_subset['HR'],
name=hora,
marker_color=color
))
# Actualizar el diseño del gráfico
figbox.update_layout(
title="Distribución de Humedad Relativa por Hora del Día",
xaxis_title="Hora del Día",
yaxis_title="Humedad Relativa(%)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_horas,
ticktext=orden_horas,
categoryorder='array', # Ordenar las horas en el orden especificado
categoryarray=orden_horas # Especificar el orden de las horas
)
)
figbox.show()
En relación con los gráficos analizados, se observa una tendencia consistente en la humedad relativa (%) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica una tendencia inversa en las mediciones de humedad relativa (%) en contraste con la temepratura ambiente (°C).
Ozono (O3) #
import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(go.Scatter(
x=df_compartir['fecha'],
y=df_compartir['O3'],
mode='lines', # Mostrar la línea
line=dict(color='#30143F'), # Cambiar el color de la línea
name='Ozono (µg/m³)',
opacity=0.7 # Ajustar la opacidad de la línea (0.0 es completamente transparente, 1.0 es completamente opaco)
))
fig.update_layout(
title='Ozono a lo Largo del Tiempo',
xaxis_title='Fecha',
yaxis_title='Ozono (µg/m³)',
xaxis=dict(tickangle=45, tickformat='%Y-%m-%d'),
yaxis=dict(tickformat='.1f'), # Formato de los ticks del eje Y (un decimal)
template='plotly_white', # Fondo blanco
title_x=0.5, # Centrar el título
title_font=dict(size=16) # Ajustar el tamaño de la fuente del título
)
fig.show()
import plotly.express as px
import plotly.graph_objects as go
fig_density = px.histogram(df_compartir, x="O3", marginal="box", nbins=50, title="Densidad de Ozono Estación Compartir",
labels={'Ozono (µg/m³)'}, color_discrete_sequence=['#30143F'])
fig_density.update_traces(
marker=dict(color='#30143F', opacity=0.7), # Ajustar la opacidad de las barras
selector=dict(type='histogram')
)
fig_density.update_layout(
xaxis_title="Ozono (µg/m³)",
yaxis_title="Frecuencia",
showlegend=False
)
fig_density.show()
import plotly.graph_objects as go
import pandas as pd
# Crear una lista única de años para el eje x
años = sorted(df_compartir['Año'].unique())
# Definir los colores para cada año
colores_años = ['#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31',
'#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8b902', '#f8b902']
figbox = go.Figure()
# Añadir trazas manualmente para cada año con colores específicos
for i, año in enumerate(años):
df_subset = df_compartir[df_compartir['Año'] == año]
figbox.add_trace(go.Box(
y=df_subset['O3'],
name=str(año),
marker_color=colores_años[i % len(colores_años)] # Asignar un color específico a cada año
))
# Actualizar el diseño del gráfico
figbox.update_layout(
title="Distribución de Ozono por Año",
xaxis_title="Año",
yaxis_title="Ozono (µg/m³)",
title_x=0.5, # Centrar el título
xaxis=dict(
title="Año",
tickmode='array',
tickvals=años, # Asegurar que todos los años se muestran
ticktext=[str(año) for año in años] # Etiquetas para cada año
)
)
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de los meses en español
orden_meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
# Crear un diccionario para mapear números de mes a nombres en español
nombres_meses = {i+1: mes for i, mes in enumerate(orden_meses)}
# Crear un diccionario para mapear nombres de mes a números
mes_a_numero = {mes: i+1 for i, mes in enumerate(orden_meses)}
# Definir una lista de colores para los meses
colores_meses = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f', '#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902']
# Crear una columna adicional para el mes basado en la fecha
df_compartir['Mes'] = df_compartir['fecha'].dt.month.map(nombres_meses)
# Mapear los nombres de los meses a números para ordenar
df_compartir['Mes_Num'] = df_compartir['Mes'].map(mes_a_numero)
# Crear una figura usando plotly.graph_objects
figbox = go.Figure()
# Añadir trazas para cada mes con colores distintos
for mes, color in zip(orden_meses, colores_meses):
df_subset = df_compartir[df_compartir['Mes'] == mes]
figbox.add_trace(go.Box(
y=df_subset['O3'],
name=mes,
marker_color=color
))
# Actualizar el diseño del gráfico
figbox.update_layout(
title="Distribución de Ozono Mensual",
xaxis_title="Mes",
yaxis_title="Ozono (µg/m³)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_meses,
ticktext=orden_meses,
categoryorder='array', # Ordenar los meses en el orden especificado
categoryarray=orden_meses # Especificar el orden de los meses
)
)
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de los días de la semana en español
orden_dias = ["Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"]
# Crear un diccionario para mapear números de día de la semana a nombres en español
nombres_dias = {i: dia for i, dia in enumerate(orden_dias, start=0)}
# Crear un diccionario para mapear nombres de días a números
dia_a_numero = {dia: i for i, dia in enumerate(orden_dias)}
# Definir una lista de colores para los días de la semana
colores_dias = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f']
# Crear una columna adicional para el día de la semana basado en la fecha
df_compartir['Día'] = df_compartir['fecha'].dt.day_name().map(lambda x: {
'Monday': 'Lunes', 'Tuesday': 'Martes', 'Wednesday': 'Miércoles',
'Thursday': 'Jueves', 'Friday': 'Viernes', 'Saturday': 'Sábado', 'Sunday': 'Domingo'
}[x])
# Mapear los nombres de los días a números para ordenar
df_compartir['Día_Num'] = df_compartir['Día'].map(dia_a_numero)
# Crear una figura usando plotly.graph_objects
figbox = go.Figure()
# Añadir trazas para cada día de la semana con colores distintos
for dia, color in zip(orden_dias, colores_dias):
df_subset = df_compartir[df_compartir['Día'] == dia]
figbox.add_trace(go.Box(
y=df_subset['O3'],
name=dia,
marker_color=color
))
# Actualizar el diseño del gráfico
figbox.update_layout(
title="Distribución Ozona por Día de la Semana",
xaxis_title="Día de la Semana",
yaxis_title="Ozono (µg/m³)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_dias,
ticktext=orden_dias,
categoryorder='array', # Ordenar los días en el orden especificado
categoryarray=orden_dias # Especificar el orden de los días de la semana
)
)
figbox.show()
import plotly.graph_objects as go
import pandas as pd
# Definir el orden correcto de las horas del día
orden_horas = [f"{i:02d}:00" for i in range(24)]
# Crear un diccionario para mapear números de hora a nombres
horas_a_numero = {f"{i:02d}:00": i for i in range(24)}
# Definir una lista de colores para las horas del día
colores_horas = ['#30143F', '#432c4d', '#5a3b59', '#734764', '#8f615c', '#a86e4f', '#c67e3f',
'#d98e31', '#e69c24', '#f2aa1c', '#f5b512', '#f8b902', '#f8d024', '#f4c433',
'#f0b838', '#d8a73d', '#c09d42', '#a9914f', '#8c8e5a', '#6d8a65', '#51776c',
'#356d6f', '#1e616c', '#115f6a', '#006f6f']
# Crear una columna adicional para la hora basada en la fecha
df_compartir['Hora'] = df_compartir['fecha'].dt.hour.map(lambda x: f"{x:02d}:00")
# Mapear las horas a números para ordenar
df_compartir['Hora_Num'] = df_compartir['Hora'].map(horas_a_numero)
# Crear una figura usando plotly.graph_objects
figbox = go.Figure()
# Añadir trazas para cada hora con colores distintos
for hora, color in zip(orden_horas, colores_horas):
df_subset = df_compartir[df_compartir['Hora'] == hora]
figbox.add_trace(go.Box(
y=df_subset['O3'],
name=hora,
marker_color=color
))
# Actualizar el diseño del gráfico
figbox.update_layout(
title="Distribución de Ozono por Hora del Día",
xaxis_title="Hora del Día",
yaxis_title="Ozono (µg/m³)",
title_x=0.5, # Centrar el título
xaxis=dict(
tickmode='array',
tickvals=orden_horas,
ticktext=orden_horas,
categoryorder='array', # Ordenar las horas en el orden especificado
categoryarray=orden_horas # Especificar el orden de las horas
)
)
figbox.show()
En relación con los gráficos analizados, se observa una tendencia consistente en la concentración de Ozono (µg/m³) al segmentar los datos por año, mes y día de la semana. Sin embargo, al examinar las horas del día, se identifica que entre las 8 a.m. y 6 p.m., la mediana de la concentración de ozono muestra un incremento comparado con otras horas, con una mayor dispersión en los datos entre las 9 a.m y 5 p.m. A partir de las 3 p.m., la concentración de ozono muestran una leve disminución hasta las 6 p.m., posterior a ésta hora la temperatura se mantiene relativamente constantes hasta aproximadamente las 6 a.m. del siguiente día. En contraste con la temperatura ambiente tienen el mismo comportamiento.